package main

// 结构体中值接收者和指针接受者的区别
// 结构体值类型接收者实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量
// 结构体指针类型接受则实例化后只有结构体指针类型可以赋值给接口变量
type UnionFind struct {
	tree      []int
	numOfSets int
}

func (u *UnionFind) find(x int) int {
	if u.tree[x] == 0 {
		return x
	}
	u.tree[x] = find(u.tree[x])
	return u.tree[x]
}

func (u UnionFind) IsConnected(x, y int) bool {
	flag := u.find(x) == u.find(y)
	return flag
}

func (u *UnionFind) Merge(x, y int) {
	u.tree[u.find(x)] = u.find(y)
	u.numOfSets--
}

func maxNumEdgesToRemove(n int, edges [][]int) int {
	ret := 0
	var sliceA = make([]int, n)
	var sliceB = make([]int, n)
	var alice = &UnionFind{
		tree:      sliceA,
		numOfSets: n,
	}
	var bob = UnionFind{
		tree:      sliceB,
		numOfSets: n,
	}

	for _, v := range edges {
		if v[0] == 3 {
			if !alice.IsConnected(v[1], v[2]) {
				alice.Merge(v[1], v[2])
				bob.Merge(v[1], v[2])
			} else {
				res++
			}
		}
	}

	for _, v := range edges {
		if v[0] == 1 {
			if !alice.IsConnected(v[1], v[2]) {
				alice.Merge(v[1], v[2])
			} else {
				res++
			}
		}
		if v[0] == 2 {
			if !bob.IsConnected(v[1], v[2]) {
				bob.Merge(v[1], v[2])
			} else {
				res++
			}
		}
	}

	if alice.numOfSets*bob.numOfSets > 1 {
		return -1
	}
	return res

}

func main() {

}
